#ifndef JEFE_H
#define JEFE_H

#include <queue>
#include <map>

#include <MemoriaCompartida.h>
#include <FifoEscritura.h>
#include <FifoLectura.h>
#include <BaseException.h>
#include <SignalHandler.h>
#include <ExitHandler.h>
#include <Logger.h>
#include <MessageTxRx.h>
#include <ColaMensaje.h>
#include <MsgCliente.h>

class Jefe
{
public:
	Jefe();
	~Jefe();
	
	void crearReceptorClientes();
	void crearReceptorPlayeros();
	
	void recibirCliente();
	
	bool hayPlayerosLibres();
	
	void atenderCliente();
	
	void retirarCliente();
	
	void cerrarEstacion();
	
	ExitHandler* getExitHandler() const;
	void setExitHandler(ExitHandler* handler);
	
private:
	ColaMensaje<TCliente> m_ReceptorClientes;
	
	MemoriaCompartida<unsigned int> m_ContadorPlayerosLibres;
	FifoLectura m_ReceptorPlayeros;
	
	bool m_ReceptorPlayerosAbierto;
	
	typedef std::map<std::string,FifoEscritura*> TFifoContainer;
	typedef std::map<std::string,FifoEscritura*>::iterator TFifoContainerIt;
	
	TFifoContainer m_FifosEnvioPlayero;
	
	Logger* m_Log;
	
	std::queue<std::string> m_ClientQueue;
	
	ExitHandler* m_ExitHandler;
	
	MessageTxRx m_MessageTxRx;
	
	
	void abrirReceptorPlayeros();
	
	void enviarInstruccionCliente(const std::string& pathFifocliente, const char* instruccion);
	
	std::string obtenerPlayeroLibre();
	FifoEscritura& obtenerFifoEscritura(TFifoContainer& contenedor, const std::string& fifoPathName);
};

#endif // JEFE_H
